package cn.kent.templateMethodPattern;

/**
 * @author kent
 * @date 2021/5/18 13:34
 */
public abstract class HummerModel {
    // 是否要响
    private boolean isAlarm = false;

    /**
     * 首先，这个模型要能被发动起来，别管是手动还是电动，反正要能够发动起来，那这个实现要在实现类里面了
     */
    protected abstract void start();

    /**
     * 能停下来才是真本事
     */
    protected abstract void stop();

    /**
     * 喇叭
     */
    protected abstract void alarm();

    /**
     * 发动机轰鸣
     */
    protected abstract void engineBoom();

    /**
     * 钩子方法，默认是不会响的
     *
     * @return bool
     */
    protected boolean isAlarm() {
        return this.isAlarm;
    }

    /**
     * 是否会响取决于客户选择
     */
    protected void setAlarm(Boolean bool) {
        this.isAlarm = bool;
    }

    /**
     * ** 模板方法 **
     * 模型会跑
     */
    final public void run() {
        // 发动骑车
        this.start();
        if (this.isAlarm()) {
            // 开始轰鸣
            this.engineBoom();
            // 开始鸣笛
            this.alarm();
        }
        // 到达目的地停车
        this.stop();
    }

}
